<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 函数之初始化参数
        // function test(a = 2, b = 2){
        //     console.log(a, b);// 1 2
        // }
        // test(1)

        // function test(a = 2, b = 2){ // es6写法，低版本浏览器不支持
        //     console.log(a, b);// 2 1
        // }
        // test(undefined, 1)

        // 预编译
        // 1、js引擎通篇检查语法错误
        // 1.5、预编译的过程
        // 2、解释一行，执行一行

        // 函数声明整体提升；变量只有声明提升，赋值不提升；
        
        // 预编译法则

        // 暗示全局变量 imply global variable

        // 函数预编译（函数执行之前要进行的一个步骤 => AO）
        // AO: 活跃对象（函数上下文）
        /**
        * 1、首先创建了一个AO对象
        * 2、寻找形参和变量声明
        * 3、实参传给形参
        * 4、找函数声明，赋值
        * 5、执行
        **/
        // function test(a){
        //     console.log(a);
        //     var a = 1;
        //     console.log(a);
        //     function a(){}
        //     console.log(a);
        //     var b = function(){}
        //     console.log(b);
        //     function d(){}
        // }

        // AO = {
        //     a: undefined -> 2 -> function a(){} -> 1,
        //     b: undefined -> function(){},
        //     d: function d(){},
        // }

        // test(2);

        // function test1(a, b){
        //     function b(){}
        //     function d(){}
        //     console.log(a);
        //     c = 0;
        //     var c;
        //     a = 5;
        //     b = 6;
        //     console.log(b);
        //     console.log(b);
        // }

        // test1(1);

        // AO = {
        //     a: undefined -> 1 -> 5,
        //     b: undefined -> function b(){} -> 6,
        //     c: undefined -> 0,
        //     d: function d(){}
        // }

        // GO global object 全局上下文
        /**
        * 1、创建一个GO对象
        * 2、找变量
        * 3、找函数声明
        * 4、赋值
        * 5、执行
        **/

        // var a = 1;
        // function a(){
        //     console.log(2);
        // }

        // GO = {
        //     a: undefined -> function a(){} -> 1
        // }

        // function a(a){
        //     function a(){
        //         var b = 5;
        //         console.log(b);
        //     }
        //     console.log(a);
        //     var a = 2;
        //     console.log(a);
        // }
        // var b = 3;
        // console.log(a);

        // a(1);

        // function test(){
        //     function a(){
        //         var a = 2;
        //     }
        //     return a;
        //     a = 1;
        // }
        // console.log(test());
        
        // AO = {
        //     a: undefined -> function a(){...}
        // }

        // function test(){
        //     function a(){}
        //     a = 1;
        //     var a = 2;
        //     return a;
        // }

        // console.log(test());

        // AO = {
        //     a: undefined -> function a(){} -> 1 -> 2
        // }

        // function test(e){
        //     var c;
        //     var a;
        //     function e(){}
        //     arguments[0] = 2;
        //     console.log(e);
        //     if(a){
        //         var b = 3;
        //     }
        //     a = 4;
        //     console.log(b);
        //     f = 5;
        //     console.log(c);
        //     console.log(a);
        // }
        // var a;
        // a = 1;
        // test(1);

        // GO = {
        //     a: undefined -> 1
        // }

        // AO = {
        //     e: undefined -> 1 -> function e(){} -> 2,
        //     c: undefined,
        //     a: undefined -> 4,
        //     b: undefined,
        //     f: undefined -> 5
        // }
    </script>
</body>
</html>